知识点名称:传感器框架
编号: K12-2
前驱知识点编号:K12-1
作者:
讲义内容:
开发者可以通过使用传感器框架来访问传感器并获取传感器数据。传感器框架属于android.hardware包,包括了下面这几个类和接口:
SensorManager
使用这个类创建传感器服务的一个实例。这个类提供了几个方法来列出并获取所有的传感器,注册和注销传感器事件监听器。这个类还包含了一个传感器相关的常量,用于定义传感器的精度,设置传感器的数据更新频率和校准传感器。
Sensor
使用这个类来创建一个特定传感器的实例。这个类可以用来获取传感器的信息。
SensorEvent
系统使用这个类来创建传感器事件对象。事件对象包括了如下信息:传感器原始数据、事件类型、数据精度、事件的时间戳。
SensorEventListener
使用这个类来创建带有两个回调函数的监听器,用于监听传感器的数据变化和精度变化。
一个典型的传感器相关的应用通常需要完成两个任务:
识别传感器和传感器的功能:如果你的应用程序依赖于特定的传感器,那么在运行时识别传感器和传感器的能力就非常有用。例如,你可能需要识别当前设备上所有的传感器,如果应用特性所依赖的传感器不存在,就需要禁用这些特性。同样地,你可能需要识别特定类型的传感器,然后选择一个对你的应用来说最佳性能的传感器实现。
监控传感器:通过监控传感器事件你就能获取传感器的原始数据。每当传感器检测到参数变化就会产生一个传感器事件。传感器事件提供了四种信息:传感器触发的事件名称,事件的时间戳,事件的数据精度,触发传感器事件的原始数据。
使用Android框架识别设备上的传感器和传感器能力的方法非常简单。首先,你需要使用SENSOR_SERVICE作为参数调用getSystemService()方法,这个方法会创建一个SensorManager类的实例。例如:
Private SensorManager mSensorManager;
...
//创建SensorManager类的实例
mSensorManger = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//获取设备上所有的传感器并存放到一个列表
List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
如果你想要获取某种给定类型的传感器列表,你可以使用其他常量来代替TYPE_ALL,例如TYPE_GYRSCOPE, TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY。
你也可以调用SensorManager类的getDefaultSensor()方法来获取特定类型传感器中的一个默认的传感器。如果这个类型的传感器不存在,则返回返回null。代码如下所示:
private SensorManager mSensorManager;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//判断设备是否具备地磁传感器
if (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){
// 获取地磁传感器成功
}
else {
// 失败!设备上没有地磁
}
监控传感器事件的接口SensorEventListener有两个回调函数:onAccuracyChanged()和onSensorChanged。Android系统会在发生下列事件时调用这两个函数:
- 传感器的精度发生变化 在这种情况下,Android系统会调用onAccurayChanged()方法,方法会传递给你一个改变了精度的Sensor对象。传感器精度由四个常量中的一个来表示,它们是SENSOR_STATUS_ACCURACY_LOW, SENSOR_STATUS_ACCURACY_MEDIUM, SENSOR_STATUS_ACCURACY_HIGH, SENSOR_STATUS_ACCURACY_UNRELIABLE。
- 传感器获取到一个新的数据 在这种情况下,系统会调用onSensorChanged()方法,方法会传递给你一个SensorEvent对象,SensorEvent对象包括了:数据精度,产生数据的传感器,数据产生的时间戳以及传感器新获取的数据。
下面代码展示了如何使用传感器事件监控光度计的数据:
public class SensorActivity extends Activity implements SensorEventListener {
// 声明SensorManager变量
private SensorManager mSensorManager;
// 声明光度计变量
private Sensor mLight;
@Override
public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建SensorManger对象实例
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//创建光度计实例
mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
@Override
public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// 当传感器精度发生变化时,这个方法被调用
}
//当光度计获取到新的数据时,这个方法被调用
@Override
public final void onSensorChanged(SensorEvent event) {
// 光度计只返回一个数值光照强度
// 很多传感器返回3个值,每个轴一个值
float lux = event.values[0];
// 使用光照强度的值
}
@Override
protected void onResume() {
super.onResume();
// 将当前Activity类注册为光度计的传感器监听器
// SENSOR_DELAY_NORMAL表示取样频率,默认值是0.2秒采样一次
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
// 注销传感器事件的监听器
mSensorManager.unregisterListener(this);
}
}